﻿/*
****************************************************************************************************************
*= = 版权信息：Copyright (C) 356 - 999. Ombres Industry Empiral. All rights reserved.
*= = 文件名称：Harbour.cxx
*= = 功能描述：五色水仙主站定义主文件
*= = 编写人员：Carlyon W. Tung
****************************************************************************************************************
*/

/*
*===============================================================================================================
*= = 声明文件
*===============================================================================================================
*/

#include <chrono>
#include <cstdio>
#include <thread>

#include <Orcinus.h>

#include "Harbour.h"

/*
*===============================================================================================================
*= = 预处理声明
*===============================================================================================================
*/

#ifdef HAVE_CONFIG_H
    #include <config.h>
#endif // End of HAVE_CONFIG_H

/*
*===============================================================================================================
*= = 宏定义
*===============================================================================================================
*/

#define COPYRIGHT "Copyright (C) 356 - 999. Ombres Industry Empiral. All rights reserved."
#define HBVERSION "Harbour 1.0.1 - 365"
#define HBAUTHORS "Carlyon W. Tung    loongs@syuusui.com"

/*
*===============================================================================================================
*= = 命名空间
*===============================================================================================================
*/

using namespace Harbour;
using namespace std;

/*
*===============================================================================================================
*= = 全局变量
*===============================================================================================================
*/

static const char* tmf = "Dwarfs.csv";
static const char* tsf = "Ginkgo.csv";

static sig_atomic_t running = 0;

/*
*===============================================================================================================
*= = 函数定义
*===============================================================================================================
*/

/*
*===============================================================================================================
*= = 函数名称：harbour_sigint
*= = 功能描述：五色水仙客户端信号处理函数
*= = 入口参数：int
*= = 出口参数：void
*===============================================================================================================
*/

static void harbour_sigint(int signum)
{
    running = 0;
}

/*
*===============================================================================================================
*= = 函数名称：harbour_start
*= = 功能描述：启动五色水仙客户端
*= = 入口参数：void
*= = 出口参数：int
*===============================================================================================================
*/

static int harbour_start(void)
{
    const char* config_files[] = { tmf, tsf, NULL };

    if (iec_load_config_from_files("./Asgard", "Harbour.csv", config_files, NULL, NULL) < 0)
    {
        fprintf(stderr, "%s\n", iec_lasterror());
        return -1;
    }

    iec_set_event_listener(NULL);

    if (iec_start() < 0)
    {
        fprintf(stderr, "%s\n", iec_lasterror());
        iec_free();

        return -1;
    }

    return EXIT_SUCCESS;
}

/*
*===============================================================================================================
*= = 函数名称：harbour_run
*= = 功能描述：运行五色水仙客户端
*= = 入口参数：void
*= = 出口参数：int
*===============================================================================================================
*/

static int harbour_run(void)
{

#ifndef __ORCINUS_AS_SERVICE__
    signal(SIGINT, harbour_sigint);
#endif

    for (running = 1; running; std::this_thread::sleep_for(std::chrono::seconds(1)))
    {
        int ca = rand() % 2 + 1;
        int ioa = rand() % 4 + 1;
        if (rand() & 1)
        {
            float value = (rand() / (float)RAND_MAX) * 100;

#ifndef __ORCINUS_AS_SERVICE__
            printf("SET %03d/%d\t = %.3f\n", ca, ioa, value);
#endif

            iec_lock();
            iec_object_set_value(ca, ioa, &value, NULL, NULL);
            iec_unlock();
        }
        else
        {
            int value = rand() & 3;

#ifndef __ORCINUS_AS_SERVICE__
            printf("SET %03d/%d\t = %d\n", ca, ioa + 500, value);
#endif

            iec_lock();
            iec_object_set_value(ca, ioa + 500, &value, NULL, NULL);
            iec_unlock();
        }
    }

    return EXIT_SUCCESS;
}

/*
*===============================================================================================================
*= = 函数名称：harbour_stop
*= = 功能描述：停止五色水仙客户端
*= = 入口参数：void
*= = 出口参数：void
*===============================================================================================================
*/

static void harbour_stop(void)
{
    iec_stop();
    iec_free();
}

/*
*===============================================================================================================
*= = 函数名称：harbour_error
*= = 功能描述：五色水仙客户端错误处理函数
*= = 入口参数：void
*= = 出口参数：void
*===============================================================================================================
*/

static const char* harbour_error(void)
{
    static char buffer[256] = {0};
    sprintf(buffer, "%s\n", strerror(errno));

    return buffer;
}

/*
*===============================================================================================================
*= = 函数名称：main
*= = 功能描述：基本入口函数
*= = 入口参数：int、char **
*= = 出口参数：int
*===============================================================================================================
*/

int main(int argc, char *argv[])
{
    std::cout << COPYRIGHT << std::endl;
    std::cout << HBVERSION << std::endl;
    std::cout << HBAUTHORS << std::endl;

    std::cout << "Harbour - Harbour: Hello, master!" << std::endl;

#ifdef __INSIGHT_OS_WINDOWS__
    sockets_init();
    atexit(sockets_free);
#endif

#ifdef __ORCINUS_AS_SERVICE__
    //
#else
    if (0 != harbour_start() || 0 != harbour_run())
    {
        std::cout << "Harbour - Harbour: Sorry, master!" << std::endl;
        return EXIT_FAILURE;
    }

    harbour_stop();
#endif

    std::cout << "Harbour - Harbour: Goodbye, master!" << std::endl;
    return EXIT_SUCCESS;
}


/*
****************************************************************************************************************
*= = 文件结束
****************************************************************************************************************
*/


